home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-09-22 | 25.2 KB | 602 lines |
- IMPLEMENTATION MODULE Excard;
-
- (* Implementationsmodul Excard Version 1.0 *
- * Copyright: K. Hartlage, Pr.Stroehen 194, 4993 Rahden *
- * Berechnung (Ex-)tra langer (Card-)inalzahlen; *
- * Es kann natuerlich keine Gewaehr fuer die Richtigkeit der *
- * Prozeduren gegeben werden. *
- * Verbesserungen, Berichtigungen und eigene Anwendungen bitte an die *
- * obige Adresse senden *)
-
- (*$T-*) (* Achtung: range checking ausgeschaltet *)
-
- FROM SYSTEM IMPORT ADR,ADDRESS,CODE;
-
- FROM Strings IMPORT String,Length;
-
- FROM InOut IMPORT Write,WriteLn,ReadString,WriteString;
-
- CONST TwoPow16 = 65536;
-
- TYPE pChar = POINTER TO CHAR;
- pCard = POINTER TO CARDINAL;
-
- (*$P-*)
- PROCEDURE Def(VAR a : ExCard; b : ADDRESS);
- (* a := b *)
- BEGIN
- CODE(048E7H,08018H); (* def movem.l d0/a3-a4,-(sp)*)
- CODE(0266FH,00010H); (* movea.l $10(sp),a3 ;^b*)
- CODE(0286FH,00014H); (* movea.l $14(sp),a4 ;^a *)
- CODE(03013H); (* move.w (a3),d0*)
- CODE(0E248H); (* lsr.w #1,d0*)
- CODE(028DBH); (* l5 move.l (a3)+,(a4)+*)
- CODE(051C8H,0FFFCH); (* dbf d0,l5*)
- CODE(04CDFH,01801H); (* movem.l (sp)+,d0/a3-a4*)
- CODE(04E75H); (* rts*)
- END Def;
-
- (*$P-*)
- PROCEDURE CardToExCard( VAR a : ExCard; b : CARDINAL);
- (* a := b *)
- BEGIN
- CODE(02F0CH); (* move.l a4,-(sp)*)
- CODE(0286FH,0000AH); (* movea.l $A(sp),a4*)
- CODE(038FCH,00001H); (* move.w #1,(a4)+*)
- CODE(038AFH,00008H); (* move.w $8(sp),(a4)*)
- CODE(0285FH); (* movea.l (sp)+,a4*)
- CODE(04E75H); (* rts*)
- END CardToExCard;
-
- (*$P-*)
- PROCEDURE ExEqual(VAR a,b : ExCard) : BOOLEAN;
- (* a = b ? *)
- BEGIN
- CODE(048E7H,08018H); (* equal movem.l d0/a3-a4,-(sp)*)
- CODE(0286FH,00010H); (* movea.l $10(sp),a4*)
- CODE(0266FH,00014H); (* movea.l $14(sp),a3*)
- CODE(03014H); (* move.w (a4),d0*)
- CODE(0B74CH); (* l8 cmpm.w (a4)+,(a3)+*)
- CODE(056C8H,0FFFCH); (* dbne d0,l8*)
- CODE(06700H,0000CH); (* beq equtrue*)
- CODE(04CDFH,01801H); (* movem.l (sp)+,d0/a3-a4*)
- CODE(0422FH,0000CH); (* clr.b $C(sp)*)
- CODE(04E75H); (* rts*)
- CODE(04CDFH,01801H); (* equtrue movem.l (sp)+,d0/a3-a4*)
- CODE(01F7CH,00001H,0000CH); (* move.b #1,$C(sp)*)
- CODE(04E75H); (* rts*)
- END ExEqual;
-
- (*$P-*)
- PROCEDURE ExLess (VAR a,b : ExCard) : BOOLEAN;
- (* a < b ? *)
- BEGIN
- CODE(048E7H,0C018H); (* less movem.l d0-d1/a3-a4,-(sp)*)
- CODE(0266FH,00014H); (* movea.l 20(sp),a3*)
- CODE(0286FH,00018H); (* movea.l 24(sp),a4*)
- CODE(0301BH); (* move.w (a3)+,d0*)
- CODE(0B05CH); (* cmp.w (a4)+,d0*)
- CODE(06500H,00030H); (* bcs lesfals*)
- CODE(06200H,00020H); (* bhi lestrue*)
- CODE(03200H); (* move.w d0,d1*)
- CODE(05341H); (* subq.w #1,d1*)
- CODE(0D040H); (* add.w d0,d0*)
- CODE(049F4H,00000H); (* lea $0(a4,d0.w),a4*)
- CODE(047F3H,00000H); (* lea $0(a3,d0.w),a3*)
- CODE(03023H); (* loop move.w -(a3),d0*)
- CODE(0B064H); (* cmp.w -(a4),d0*)
- CODE(06500H,00016H); (* bcs lesfals*)
- CODE(056C9H,0FFF6H); (* dbne d1,loop*)
- CODE(06700H,0000EH); (* beq lesfals*)
- CODE(04CDFH,01803H); (* lestrue movem.l (sp)+,d0-d1/a3-a4*)
- CODE(01F7CH,00001H,0000CH);(* move.b #1,$C(sp)*)
- CODE(04E75H); (* rts*)
- CODE(04CDFH,01803H); (* lesfals movem.l (sp)+,d0-d1/a3-a4*)
- CODE(0422FH,0000CH); (* clr.b $C(sp)*)
- CODE(04E75H); (* rts*)
- END ExLess;
-
- (*$P-*)
- PROCEDURE ExOdd(VAR a : ExCard) : BOOLEAN;
- (* ODD(a) ? *)
- BEGIN
- CODE(048E7H,08080H); (* odd movem.l d0/a0,-(sp)*)
- CODE(0206FH,0000CH); (* movea.l 12(sp),a0*)
- CODE(02010H); (* move.l (a0),d0*)
- CODE(0E248H); (* lsr.w #1,d0*)
- CODE(06500H,0000CH); (* bcs oddtrue*)
- CODE(04CDFH,00101H); (* movem.l (sp)+,d0/a0*)
- CODE(0422FH,00008H); (* clr.b 8(sp)*)
- CODE(04E75H); (* rts*)
- CODE(04CDFH,00101H); (* oddtrue movem.l (sp)+,d0/a0*)
- CODE(01F7CH,00001H,00008H); (* move.b #1,8(sp)*)
- CODE(04E75H); (* rts *)
- END ExOdd;
-
- (*$P-*)
- PROCEDURE ExInc(VAR a : ExCard);
- (* a := a+1 *)
- BEGIN
- CODE(02F0CH); (* move.l a4,-(sp)*)
- CODE(0286FH,00008H); (* movea.l $8(sp),a4*)
- CODE(03F00H); (* move.w d0,-(sp)*)
- CODE(0301CH); (* move.w (a4)+,d0 *)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(0525CH); (* loopsuc addq.w #1,(a4)+ *)
- CODE(054C8H,0FFFCH); (* dbcc d0,loopsuc*)
- CODE(06400H,0000CH); (* bcc exsucc0 *)
- CODE(038BCH,00001H); (* move.w #1,(a4) *)
- CODE(0286FH,0000AH); (* movea.l $A(sp),a4 *)
- CODE(05254H); (* addq.w #1,(a4) *)
- CODE(0301FH); (* move.w (sp)+,d0*)
- CODE(0285FH); (* movea.l (sp)+,a4*)
- CODE(04E75H); (* rts*)
- END ExInc;
-
- (*$P-*)
- PROCEDURE ExDec(VAR a : ExCard);
- (* a := a-1 *)
- (* ACHTUNG : ExDec(0)= runtime error #3 (arithmetic overflow) *)
- BEGIN
- CODE(048E7H,0C080H); (* pred movem.l d0-d1/a0,-(sp)*)
- CODE(0206FH,00010H); (* movea.l $10(sp),a0 *)
- CODE(00C90H,00001H,00000H);(* cmpi.l #$00010000,(a0)*)
- CODE(06600H,00008H); (* bne weiter*)
- CODE(044FCH,00002H); (* move.w #2,ccr*)
- CODE(04E76H); (* trapv*)
- CODE(03018H); (* weiter move.w (a0)+,d0*)
- CODE(03200H); (* move.w d0,d1*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(05358H); (* pl7 subq.w #1,(a0)+*)
- CODE(054C8H,0FFFCH); (* dbcc d0,pl7*)
- CODE(04A40H); (* tst.w d0*)
- CODE(06A00H,00018H); (* bpl pred0*)
- CODE(04A60H); (* tst.w -(a0)*)
- CODE(06600H,00012H); (* bne pred0*)
- CODE(05341H); (* subq.w #1,d1*)
- CODE(04A41H); (* tst.w d1*)
- CODE(06600H,00004H); (* bne pred1*)
- CODE(05241H); (* addq.w #1,d1*)
- CODE(0206FH,00010H); (* pred1 movea.l $10(sp),a0*)
- CODE(03081H); (* move.w d1,(a0) *)
- CODE(04CDFH,00103H); (* pred0 movem.l (sp)+,d0-d1/a0*)
- CODE(04E75H); (* rts*)
- END ExDec;
-
- (*$P-*)
- PROCEDURE ExAdd(VAR sum,a,b : ExCard);
- (* sum := a + b *)
- BEGIN
- CODE(048E7H,00038H); (* movem.l a2-a4,-(sp)*)
- CODE(0246FH,00010H); (* movea.l $10(sp),a2 ;^b*)
- CODE(0266FH,00014H); (* movea.l $14(sp),a3 ;^a*)
- CODE(0286FH,00018H); (* movea.l $18(sp),a4 ;^sum*)
- CODE(048A7H,07C00H); (* movem.w d1-d5,-(sp)*)
- CODE(03412H); (* move.w (a2),d2 ;b.length*)
- CODE(0B453H); (* cmp.w (a3),d2*)
- CODE(06300H,00004H); (* bls goon ;b<=a=true?*)
- CODE(0C74AH); (* exg a2,a3*)
- CODE(0341AH); (* goon move.w (a2)+,d2 ;d2=a.length *)
- CODE(0361BH); (* move.w (a3)+,d3*)
- CODE(038C3H); (* move.w d3,(a4)+*)
- CODE(03203H); (* move.w d3,d1*)
- CODE(09242H); (* sub.w d2,d1*)
- CODE(05342H); (* subq.w #1,d2*)
- CODE(0381AH); (* loop0 move.w (a2)+,d4*)
- CODE(03A1BH); (* move.w (a3)+,d5*)
- CODE(0DB44H); (* addx.w d4,d5*)
- CODE(038C5H); (* move.w d5,(a4)+*)
- CODE(051CAH,0FFF6H); (* dbf d2,loop0*)
- CODE(00C41H,00000H); (* cmpi.w #0,d1*)
- CODE(06700H,00010H); (* beq end0*)
- CODE(0383CH,00000H); (* move.w #0,d4*)
- CODE(03A1BH); (* loop1 move.w (a3)+,d5*)
- CODE(0DB44H); (* addx.w d4,d5*)
- CODE(038C5H); (* move.w d5,(a4)+*)
- CODE(051C9H,0FFF8H); (* dbf d1,loop1*)
- CODE(040C1H); (* end0 move.w sr,d1*)
- CODE(00801H,00004H); (* btst.l #4,d1*)
- CODE(06700H,0000CH); (* beq end1*)
- CODE(038FCH,00001H); (* move.w #1,(a4)+*)
- CODE(0286FH,00022H); (* movea.l $22(sp),a4*)
- CODE(05254H); (* addq.w #1,(a4)*)
- CODE(04C9FH,0003EH); (* end1 movem.w (sp)+,d1-d5*)
- CODE(04CDFH,01C00H); (* movem.l (sp)+,a2-a4*)
- CODE(04E75H); (* rts*)
- END ExAdd ;
- (*$P-*)
- PROCEDURE ExSub(VAR diff,a,b : ExCard);
- (* diff := a - b *)
- (* ACHTUNG : Es muß gelten a>=b *)
- BEGIN
- CODE(048E7H,0F8F8H); (* sub movem.l d0-d4/a0-a4,-(sp)*)
- CODE(0206FH,0002CH); (* movea.l 44(sp),a0 ; ^b *)
- CODE(0266FH,00030H); (* movea.l 48(sp),a3 ; ^a *)
- CODE(0286FH,00034H); (* movea.l 52(sp),a4 ; ^diff *)
- CODE(0361BH); (* move.w (a3)+,d3 ;a.length *)
- CODE(03003H); (* move.w d3,d0 *)
- CODE(03418H); (* move.w (a0)+,d2 ;b.length*)
- CODE(02448H); (* movea.l a0,a2*)
- CODE(09042H); (* sub.w d2,d0 *)
- CODE(06700H,00012H); (* beq sgoon ;a.length=b.length? *)
- CODE(0D442H); (* add.w d2,d2 *)
- CODE(045F2H,02000H); (* lea $0(a2,d2.w),a2*)
- CODE(05340H); (* subq.w #1,d0 *)
- CODE(0425AH); (* sloop0 clr.w (a2)+ *)
- CODE(051C8H,0FFFCH); (* dbf d0,sloop0 *)
- CODE(02448H); (* movea.l a0,a2 *)
- CODE(03403H); (* sgoon move.w d3,d2 *)
- CODE(05342H); (* subq.w #1,d2*)
- CODE(038FCH,00001H); (* move.w #1,(a4)+ *)
- CODE(0321AH); (* sloop1 move.w (a2)+,d1*)
- CODE(0381BH); (* move.w (a3)+,d4 *)
- CODE(09941H); (* subx.w d1,d4 *)
- CODE(038C4H); (* move.w d4,(a4)+ *)
- CODE(051CAH,0FFF6H); (* dbf d2,sloop1 *)
- CODE(04A64H); (* snext tst.w -(a4)*)
- CODE(056CBH,0FFFCH); (* dbne d3,snext*)
- CODE(04A43H); (* tst.w d3*)
- CODE(06600H,00004H); (* bne send*)
- CODE(05243H); (* addq.w #1,d3*)
- CODE(0286FH,00034H); (* send movea.l 52(sp),a4*)
- CODE(03883H); (* move.w d3,(a4)*)
- CODE(04CDFH,01F1FH); (* movem.l (sp)+,d0-d4/a0-a4*)
- CODE(04E75H); (* rts*)
- END ExSub ;
- (*$P-*)
- PROCEDURE ExWordLeft(VAR a : ExCard; c : CARDINAL);
- (* a := a * (2 ^ (16*c)) *)
- (* ACHTUNG : Es muss gelten c # 0 *)
- BEGIN
- CODE(048E7H,0E0C0H); (* wleft movem.l d0-d2/a0-a1,-(sp)*)
- CODE(0302FH,00018H); (* move.w 24(sp),d0 ;value(c)*)
- CODE(0206FH,0001AH); (* movea.l 26(sp),a0 ;^a*)
- CODE(03210H); (* move.w (a0),d1*)
- CODE(03401H); (* move.w d1,d2*)
- CODE(0D440H); (* add.w d0,d2*)
- CODE(03082H); (* move.w d2,(a0)*)
- CODE(0D442H); (* add.w d2,d2*)
- CODE(043F0H,02002H); (* lea $2(a0,d2.w),a1*)
- CODE(03401H); (* move.w d1,d2*)
- CODE(0D442H); (* add.w d2,d2*)
- CODE(041F0H,02002H); (* lea $2(a0,d2.w),a0*)
- CODE(05341H); (* subq.w #1,d1*)
- CODE(03320H); (* wloop1 move.w -(a0),-(a1)*)
- CODE(051C9H,0FFFCH); (* dbf d1,wloop1*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(04261H); (* wloop2 clr.w -(a1)*)
- CODE(051C8H,0FFFCH); (* dbf d0,wloop2*)
- CODE(04CDFH,00307H); (* wend movem.l (sp)+,d0-d2/a0-a1*)
- CODE(04E75H); (* rts*)
- END ExWordLeft;
- (*$P-*)
- PROCEDURE ExShl(VAR a : ExCard);
- (* a := a * 2 *)
- BEGIN
- CODE(048E7H,08008H); (* movem.l d0/a4,-(sp)*)
- CODE(0286FH,0000CH); (* movea.l $C(sp),a4*)
- CODE(0301CH); (* move.w (a4)+,d0*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(0E5DCH); (* loop roxl.w (a4)+*)
- CODE(051C8H,0FFFCH); (* dbf d0,loop*)
- CODE(06400H,0000CH); (* bcc end*)
- CODE(038BCH,00001H); (* move.w #1,(a4)*)
- CODE(0286FH,0000CH); (* movea.l $C(sp),a4*)
- CODE(05254H); (* addq.w #1,(a4)*)
- CODE(04CDFH,01001H); (* end movem.l (sp)+,d0/a4*)
- CODE(04E75H); (* rts*)
- END ExShl;
- (*$P-*)
- PROCEDURE ExShr(VAR a : ExCard):BOOLEAN;
- (* a := a DIV 2; herausgeschobenes Bit bestimmt BOOLEAN-Wert *)
- BEGIN
- CODE(048E7H,08030H); (* shr movem.l d0/a2-a3,-(sp)*)
- CODE(0266FH,00010H); (* movea.l $10(sp),a3*)
- CODE(03013H); (* move.w (a3),d0*)
- CODE(0D040H); (* add.w d0,d0*)
- CODE(047F3H,00002H); (* lea $2(a3,d0.w),a3*)
- CODE(0244BH); (* movea.l a3,a2*)
- CODE(0E248H); (* lsr.w #1,d0*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(0E4E3H); (* l10 roxr.w -(a3)*)
- CODE(051C8H,0FFFCH); (* dbf d0,l10*)
- CODE(06400H,0000AH); (* bcc shrfals*)
- CODE(01F7CH,00001H,00014H); (* move.b #1,$14(sp)*)
- CODE(06004H); (* bra.s shrnext*)
- CODE(0422FH,00014H); (* shrfals clr.b $14(sp)*)
- CODE(04A62H); (* shrnext tst.w -(a2)*)
- CODE(06600H,0000CH); (* bne shrend*)
- CODE(00C63H,00001H); (* cmp.w #1,-(a3)*)
- CODE(06700H,00004H); (* beq shrend*)
- CODE(05353H); (* subq.w #1,(a3)*)
- CODE(04CDFH,00C01H); (* shrend movem.l (sp)+,d0/a2-a3*)
- CODE(04E75H); (* rts*)
- END ExShr ;
- (*$P+*)
-
-
- PROCEDURE ExMul(VAR prod,a,b : ExCard);
- (* prod := a * b *)
- VAR dummy0,dummy1,null,temp : ExCard;
-
- (*$P-*)
- PROCEDURE Mul(VAR p0,a0,b0 : ExCard);
- BEGIN
- CODE(048E7H,000FCH); (* movem.l a0-a5,-(sp)*)
- CODE(048A7H,0FE00H); (* movem.w d0-d6,-(sp)*)
- CODE(0206FH,0002AH); (* movea.l 42(sp),a0*)
- CODE(0226FH,0002EH); (* movea.l 46(sp),a1*)
- CODE(0246FH,00032H); (* movea.l 50(sp),a2*)
- CODE(03018H); (* move.w (a0)+,d0*)
- CODE(03C00H); (* move.w d0,d6*)
- CODE(03219H); (* move.w (a1)+,d1*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(03419H); (* move.w (a1)+,d2*)
- CODE(02648H); (* movea.l a0,a3*)
- CODE(04284H); (* clr.l d4*)
- CODE(03A00H); (* move.w d0,d5*)
- CODE(0284AH); (* movea.l a2,a4*)
- CODE(038FCH,00001H); (* move.w #1,(a4)+*)
- CODE(02A4CH); (* movea.l a4,a5*)
- CODE(03602H); (*mul0 move.w d2,d3*)
- CODE(0C6DBH); (* mulu.w (a3)+,d3*)
- CODE(0D684H); (* add.l d4,d3*)
- CODE(038C3H); (* move.w d3,(a4)+*)
- CODE(04843H); (* swap d3*)
- CODE(03803H); (* move.w d3,d4*)
- CODE(051CDH,0FFF2H); (* dbf d5,mul0*)
- CODE(038C4H); (* move.w d4,(a4)+*)
- CODE(05246H); (* addq.w #1,d6*)
- CODE(05541H); (* subq.w #2,d1*)
- CODE(06B00H,00030H); (* bmi back*)
- CODE(03419H); (*mul1 move.w (a1)+,d2*)
- CODE(04284H); (* clr.l d4*)
- CODE(02648H); (* movea.l a0,a3*)
- CODE(03A00H); (* move.w d0,d5*)
- CODE(0548DH); (* addq.l #2,a5*)
- CODE(0284DH); (* movea.l a5,a4*)
- CODE(03602H); (*mul2 move.w d2,d3*)
- CODE(0C6DBH); (* mulu.w (a3)+,d3*)
- CODE(0D684H); (* add.l d4,d3*)
- CODE(0D75CH); (* add.w d3,(a4)+*)
- CODE(06400H,00008H); (* bcc next0*)
- CODE(04843H); (* swap d3*)
- CODE(05243H); (* addq.w #1,d3*)
- CODE(06002H); (* bra.s next1*)
- CODE(04843H); (*next0 swap d3*)
- CODE(03803H); (*next1 move.w d3,d4*)
- CODE(051CDH,0FFE8H); (* dbf d5,mul2*)
- CODE(038C4H); (* move.w d4,(a4)+*)
- CODE(05246H); (* addq.w #1,d6*)
- CODE(051C9H,0FFD4H); (* dbf d1,mul1*)
- CODE(05346H); (*back subq.w #1,d6*)
- CODE(04A64H); (* tst.w -(a4)*)
- CODE(06700H,0FFFAH); (* beq back*)
- CODE(05246H); (* addq.w #1,d6*)
- CODE(04A46H); (* tst.w d6*)
- CODE(06600H,00008H); (* bne next2*)
- CODE(034BCH,00001H); (* move.w #1,(a2)*)
- CODE(06002H); (* bra.s next3*)
- CODE(03486H); (*next2 move.w d6,(a2)*)
- CODE(04C9FH,0007FH); (*next3 movem.w (sp)+,d0-d6*)
- CODE(04CDFH,03F00H); (* movem.l (sp)+,a0-a5*)
- CODE(04E75H); (* rts*)
- END Mul;
- (*$P+*)
- BEGIN
- IF (ADR(a)=ADR(prod)) & (ADR(b)=ADR(prod)) THEN
- Def(dummy0,ADR(a));
- Def(dummy1,ADR(b));
- Mul(prod,dummy0,dummy1);
- ELSIF ADR(a)=ADR(prod) THEN
- Def(dummy0,ADR(a));
- Mul(prod,dummy0,b);
- ELSIF ADR(b)=ADR(prod) THEN
- Def(dummy0,ADR(b));
- Mul(prod,a,dummy0);
- ELSE
- Mul(prod,a,b);
- END;
- END ExMul ;
-
- PROCEDURE ExDiv(VAR quot,a,b : ExCard);
- (* quot := a DIV b *)
- VAR rest,temp,q : ExCard;
- len,blen : CARDINAL;
- dummy : BOOLEAN;
- BEGIN
- Def(rest,ADR(a));
- CardToExCard(quot,0);
- blen:=b.length;
- WHILE NOT ExLess(rest,b) DO
- CardToExCard(q,1);
- Def(temp,ADR(b));
- len:=rest.length-blen;
- IF len>0 THEN
- ExWordLeft(temp,len);
- ExWordLeft(q,len)
- END;
- IF ExLess(temp,rest) THEN
- REPEAT
- ExShl(temp);
- ExShl(q);
- UNTIL ExLess(rest,temp);
- dummy:=ExShr(temp);
- dummy:=ExShr(q);
- ELSIF ExLess(rest,temp) THEN
- REPEAT
- dummy:=ExShr(temp);
- dummy:=ExShr(q);
- UNTIL NOT ExLess(rest,temp);
- END;
- ExSub(rest,rest,temp);
- ExAdd(quot,quot,q);
- END
- END ExDiv;
-
- PROCEDURE ExMod(VAR rest,a,b : ExCard);
- (* rest := a MOD b *)
- VAR temp0,temp,zw : ExCard;
- len,i,blen : CARDINAL;
- dummy : BOOLEAN;
- BEGIN
- Def(rest,ADR(a)); (* rest:=a *)
- blen:=b.length;
- WHILE NOT ExLess(rest,b) DO (* rest>=b ? *)
- Def(temp,ADR(b)); (* temp:=b *)
- len:=rest.length-blen;
- IF len>0 THEN
- ExWordLeft(temp,len); (* temp:=temp*2^(16*len) *)
- END;
- IF ExLess(temp,rest) THEN (* temp<rest ? *)
- REPEAT
- ExShl(temp)
- UNTIL ExLess(rest,temp);
- dummy:=ExShr(temp)
- ELSIF ExLess(rest,temp) THEN (* rest<temp ? *)
- REPEAT
- dummy:=ExShr(temp)
- UNTIL NOT ExLess(rest,temp); (* bis rest>=temp *)
- END;
- ExSub(rest,rest,temp);
- END;
- END ExMod ;
-
- PROCEDURE ExRead(VAR a : ExCard);
- VAR i,j,len,mov: CARDINAL;
- lin : String;
- m : LONGCARD;
-
- BEGIN
- CardToExCard(a,0);
- WriteLn;
- ReadString(lin);
- i:=0;
- WHILE i < Length(lin) DO
- IF ('0' <= lin[i]) & (lin[i] <= '9') THEN
- mov:=ORD(lin[i])-ORD('0');
- FOR j:=0 TO a.length-1 DO
- m:=LONGCARD(a.number[j])*10+LONGCARD(mov);
- a.number[j]:=CARDINAL(m);
- mov:=CARDINAL(m DIV TwoPow16);
- END;
- IF mov # 0 THEN
- INC(a.length);
- a.number[a.length-1]:=mov
- END;
- INC(i)
- ELSE
- WriteString('Wrong INPUT in procedure ExWrite');
- HALT;
- END
- END
- END ExRead ;
-
- PROCEDURE ExWrite( a : ExCard);
- VAR i,j,k,l : INTEGER;
- m,mov : LONGCARD;
- buffer : ARRAY [0..ExCardDigits] OF CHAR;
- pch : pChar;
- pcard,pjcard : pCard;
- BEGIN
- (* Schnelle Ausgabe nur fuer weniger als 80 Zeichen geeignet
- Compileroption P- vor Prozedur setzen
- CODE(048E7H,0F8F0H); (* lwrite movem.l d0-d4/a0-a3,-(sp)*)
- CODE(0246FH,00028H); (* movea.l 40(sp),a2*)
- CODE(04E56H,-ExCardDigits-2*ExCardLen-2);
- (* link a6,#-ExCardDigits-2*ExCardLen-2*)
- CODE(043EEH,-ExCardDigits-2*ExCardLen-2);
- (* lea -ExCardDigits-2*ExCardLen-2(a6),a1*)
- CODE(041EEH,-(2*ExCardLen)-2);(* lea -(2*ExCardLen)-2(a6),a0*)
- CODE(03012H); (* move.w (a2),d0*)
- CODE(030DAH); (* wr0 move.w (a2)+,(a0)+ *)
- CODE(051C8H,0FFFCH); (* dbf d0,wr0*)
- CODE(041EEH,-(2*ExCardLen)-2);(* lea -(2*ExCardLen)-2(a6),a0*)
- CODE(00C90H,00001H,00000H);(* cmpi.l #$00010000,(a0)*)
- CODE(06600H,0000AH); (* bne wr1*)
- CODE(07801H); (* moveq.l #1,d4*)
- CODE(032FCH,00030H); (* move.w #$30,(a1)+*)
- CODE(06046H); (* bra.s n2*)
- CODE(03010H); (* wr1 move.w (a0),d0*)
- CODE(05340H); (* subq.w #1,d0*)
- CODE(04244H); (* clr.w d4*)
- CODE(03400H); (* l3 move.w d0,d2*)
- CODE(0D442H); (* add.w d2,d2*)
- CODE(045F0H,02004H); (* lea $4(a0,d2.w),a2*)
- CODE(0264AH); (* movea.l a2,a3*)
- CODE(04A63H); (* tst.w -(a3)*)
- CODE(06600H,0000AH); (* bne n1*)
- CODE(051C8H,0FFEEH); (* dbf d0,l3*)
- CODE(06000H,0002AH); (* bra n2*)
- CODE(03400H); (* n1 move.w d0,d2*)
- CODE(04241H); (* clr.w d1*)
- CODE(04283H); (* l2 clr.l d3*)
- CODE(03622H); (* move.w -(a2),d3*)
- CODE(04841H); (* swap d1*)
- CODE(04241H); (* clr.w d1*)
- CODE(0D681H); (* add.l d1,d3*)
- CODE(086FCH,0000AH); (* divu.w #$A,d3*)
- CODE(03483H); (* move.w d3,(a2)*)
- CODE(04843H); (* swap d3*)
- CODE(03203H); (* move.w d3,d1*)
- CODE(051CAH,0FFEAH); (* dbf d2,l2*)
- CODE(00601H,00030H); (* add.b #$30,d1*)
- CODE(012C1H); (* move.b d1,(a1)+*)
- CODE(05244H); (* addq.w #1,d4*)
- CODE(06000H,0FFC2H); (* bra l3*)
- CODE(04241H); (* n2 clr.w d1*)
- CODE(05344H); (* subq.w #1,d4*)
- CODE(01221H); (* l4 move.b -(a1),d1*)
- CODE(03F01H); (* move.w d1,-(sp)*)
- CODE(03F3CH,00002H); (* move.w #2,-(sp)*)
- CODE(04E41H); (* trap #1*)
- CODE(0588FH); (* addq.l #4,sp*)
- CODE(051CCH,0FFF2H); (* dbf d4,l4*)
- CODE(04E5EH); (* unlk a6*)
- CODE(04CDFH,00F1FH); (* movem.l (sp)+,d0-d4/a0-a3*)
- CODE(04E75H); (* rts*)*)
- WriteLn; (* Ausgabe nur am Anfang einer Zeile ! *)
- IF (a.length=1) & (a.number[0]=0) THEN
- Write('0')
- ELSE
- j:=a.length-1;
- pch:=ADR(buffer[0]);
- k:=-1;
- REPEAT
- IF a.number[j]=0 THEN
- DEC(j)
- ELSE
- mov:=0;
- INC(k);
- pcard:=ADR(a.number[j]);
- FOR i:=j TO 0 BY -1 DO
- m:=LONGCARD(pcard^)+mov * TwoPow16;
- pcard^:=CARDINAL(m DIV 10);
- (*$T-*)
- DEC(pcard,2);
- (*$T=*)
- mov:=m MOD 10
- END;
- pch^:=CHR(CARDINAL(ORD('0')+mov));
- (*$T-*)
- INC(pch,1);
- (*$T=*)
- END;
- UNTIL j=-1;
- l:=0;
- FOR i:=k TO 0 BY -1 DO
- (*$T-*)
- DEC(pch,1);
- (*$T=*)
- Write(pch^);
- INC(l);
- IF l=80 THEN
- WriteLn;
- l:=0;
- END;
- END
- END
- END ExWrite ;
-
- END Excard.
-